﻿Imports BE.BE

Namespace DAL

    Public Class DAL_Patente

        Shared Function listarTodasLasPatentes() As List(Of Patente_BE)
            Dim strcomm As String = "SELECT id_patente, nombre_patente, descripcion_patente FROM patente"
            Dim Ds As New DataSet
            Dim listapatentes As New List(Of Patente_BE)
            Try
                Ds = Helper_DAL.ExecuteDataset(strcomm)
                If Ds.Tables(0).Rows.Count > 0 Then
                    For Each dr As DataRow In Ds.Tables(0).Rows
                        Dim pat As New Patente_BE
                        pat.Id = dr.Item(0)
                        pat.Nombre = dr.Item(1).ToString
                        pat.Descripcion = dr.Item(2).ToString
                        pat.Tipo = Patente_BE.Permisos.Permitido
                        listapatentes.Add(pat)
                    Next
                End If
            Catch ex As Exception
                Throw ex
            End Try
            Return listapatentes

        End Function


        Shared Function listaPatentesFinalPorUsuario(ByVal pusr As Usuario_BE) As List(Of Patente_BE)
            'UNION: patentes heredadas por familia y patentes otorgadas.
            'CASO COINCIDEN PATENTES: desempatan prevaleciendo el tipo de la patente otorgada sobre la patente heredadas por familia.
            'CASO NO EXISTIA LA PATENTE OTORGADA: se agrega a la lista de patentes del usr (disponibles)


            'traemos todas las patentes Otorgadas.
            Dim listaPatentesOtorgadas As New List(Of Patente_BE)
            listaPatentesOtorgadas = listarPatentesOtorgadas(pusr.id)

            'filtramos las patentes heredadas de familia repetidas.
            Dim listaPatentesHeredadas As New List(Of Patente_BE)
            Dim listaFinalPatentes As New List(Of Patente_BE)
            'manejamos el tema filtar patentes con hashtables.
            Dim htPatentes As New Hashtable

            For Each fam As Familia_BE In pusr.Familias
                listaPatentesHeredadas = DAL_Familia.listarPatentesDeLaFamilia(fam.Id)
                For Each pat1 As Patente_BE In listaPatentesHeredadas
                    'preguntamos si no está en la hashtable y comparamos por la clave patente.id
                    If Not htPatentes.ContainsKey(pat1.Id) Then
                        'no está -> la agregamos.
                        htPatentes.Add(pat1.Id, pat1)
                    End If
                Next
            Next

            'verificamos contra la lista de patentes otorgadas.
            For Each pato As Patente_BE In listaPatentesOtorgadas
                If htPatentes.ContainsKey(pato.Id) Then
                    'si la tenemos gana el tipo de la patente otorgada.
                    htPatentes.Item(pato.Id) = pato
                Else
                    'no estaba -> se agrega.
                    htPatentes.Add(pato.Id, pato)
                End If
            Next

            'pasamos la hashtable a nuestra lista de objetos patente.
            For Each dic As DictionaryEntry In htPatentes
                listaFinalPatentes.Add(dic.Value)
            Next

            Return listaFinalPatentes  '<-- la lista posta de patentes que tiene el usuario logueado.

        End Function


        Shared Function listarPatentesOtorgadas(ByVal pid As Integer) As List(Of Patente_BE)
            Dim strcomm As String = "SELECT * FROM usuario_patente WHERE id_usuario=" & pid

            Dim Ds As New DataSet
            Dim listaPat As New List(Of Patente_BE)

            Try
                Ds = Helper_DAL.ExecuteDataset(strcomm)
                If Ds.Tables(0).Rows.Count > 0 Then
                    For Each dr As DataRow In Ds.Tables(0).Rows
                        Dim pat As New Patente_BE
                        pat = DAL_Patente.traerPatente(dr.Item(1))
                        'por defecto  la trae permitida, de la tabla usuario_patente tomamos el estado actual.
                        If dr.Item(2) = True Then
                            pat.Tipo = Patente_BE.Permisos.Permitido
                        Else
                            pat.Tipo = Patente_BE.Permisos.Denegado
                        End If
                        listaPat.Add(pat)
                    Next
                End If
            Catch ex As Exception
                Throw ex
            End Try
            Return listaPat

        End Function


        Shared Sub guardarPatentePorUsuario(ByVal pPatente As Patente_BE, ByVal pId As Integer, pDVH As Integer)
            'busco si ya tenia guardado este usuario la patente, si estaba la borra.
            'luego se graba la patente que queriamos.
            Dim strcomm As String = "DELETE usuario_patente WHERE id_usuario = " & pId & " AND id_patente = " & pPatente.Id & _
                ";INSERT INTO usuario_patente (id_usuario, id_patente, tipo, dvh) VALUES " & _
                "(" & pId & "," & pPatente.Id & "," & pPatente.Tipo & "," & pDVH & ")"
            Try
                Helper_DAL.ExecuteNonQuery(strcomm)
            Catch ex As Exception
                Throw ex
            End Try
        End Sub


        Shared Sub quitarPatentePorUsuario(ByVal pPatente As Patente_BE, ByVal pId As Integer)
            Dim strcomm As String = "DELETE usuario_patente WHERE id_usuario = " & pId & " AND id_patente = " & pPatente.Id
            Try
                Helper_DAL.ExecuteNonQuery(strcomm)
            Catch ex As Exception
                Throw ex
            End Try
        End Sub


        Shared Function traerPatente(ByVal pid As Integer) As Patente_BE
            Dim strcomm As String = "SELECT * FROM patente WHERE id_patente=" & pid
            Dim Ds As New DataSet
            Dim patente As New Patente_BE
            Try
                Ds = Helper_DAL.ExecuteDataset(strcomm)
                If Ds.Tables(0).Rows.Count > 0 Then
                    For Each dr As DataRow In Ds.Tables(0).Rows
                        patente.Id = dr.Item(0)
                        patente.Nombre = dr.Item(1).ToString
                        patente.Descripcion = dr.Item(2).ToString
                        patente.Tipo = Patente_BE.Permisos.Permitido
                        Exit For
                    Next
                End If
            Catch ex As Exception
                Throw ex
            End Try
            Return patente
        End Function


#Region "Test.vb"
        'se usa para generarlas TEST.vb (NO ES DE LA APP)
        Shared Sub nuevaPatente(ByVal pPatente As Patente_BE)
            Dim patid As Integer = Helper_DAL.ObtenerProximoId("patente")
            Dim strcomm As String = "INSERT INTO Patente (id_patente, nombre_patente, descripcion_patente) VALUES " & _
                "(" & patid & ",'" & pPatente.Nombre & "','" & pPatente.Descripcion & "')"
            Try
                Helper_DAL.ExecuteNonQuery(strcomm)
            Catch ex As Exception
                Throw ex
            End Try
        End Sub

#End Region

    End Class

End Namespace



'Shared Function listaPatentesFinalPorUsuario(ByVal pusr As Usuario_BE) As List(Of Patente_BE)
'    'UNION: patentes heredadas por familia y patentes otorgadas.
'    'CASO COINCIDEN PATENTES: desempatan prevaleciendo el tipo de la patente otorgada sobre la patente heredadas por familia.
'    'CASO NO EXISTIA LA PATENTE OTORGADA: se agrega a la lista de patentes del usr (disponibles)

'    'traemos todas las patentes Otorgadas.
'    Dim strcomm As String = "SELECT p.id_patente, p.nombre_patente, p.descripcion_patente, up.tipo FROM patente p " & _
'        "JOIN usuario_patente up " & _
'        "ON p.id_patente = up.id_patente " & _
'        "WHERE up.id_usuario = " & pusr.id

'    Dim Ds As New DataSet
'    Dim listaPat As New List(Of Patente_BE)

'    Try
'        Ds = Helper_DAL.ExecuteDataset(strcomm)
'        If Ds.Tables(0).Rows.Count > 0 Then
'            For Each dr As DataRow In Ds.Tables(0).Rows
'                Dim pat As New Patente_BE
'                pat.Id = dr.Item(0)
'                pat.Nombre = dr.Item(1).ToString
'                pat.Descripcion = dr.Item(2).ToString
'                If dr.Item(3) Then
'                    pat.Tipo = Patente_BE.Permisos.Permitido
'                Else
'                    pat.Tipo = Patente_BE.Permisos.Denegado
'                End If
'                listaPat.Add(pat)
'            Next
'        End If
'    Catch ex As Exception
'        Throw ex
'    End Try

'    Return listaPat

'End Function